using System.Xml.Serialization;
using System.IO;
using System.Xml;


namespace Curriculum.Business.LectorDatos
{
	/// <summary>
	/// Summary description for LectorVersion.
	/// </summary>
	public class LectorVersion
	{
		string _path = null;

		public LectorVersion()
		{}

		public string Path
		{
			set { this._path = value; }
			get { return this._path; }
		}

		public Version Leer(string nroVersion)
		{
			XmlSerializer s = new XmlSerializer(typeof(Version));
			TextReader fs;

			this.InicializarPathLectura(nroVersion);

			if (File.Exists(_path))
			{
				fs = new StreamReader(_path);
			}
			else
			{
				return null;
			}
			
			XmlReader reader = new XmlTextReader(fs);
          
			// Declare an object variable of the type to be deserialized.
			Version version;

			// Use the Deserialize method to restore the object's state.
			version = (Version) s.Deserialize(reader);
			fs.Close();

			return version;
		}

		public void Escribir(Version versionXML)
		{
			XmlSerializer serializador = new XmlSerializer(typeof(Version));
			FileStream writer;
			
			this.InicializarPathEscritura();

			writer = new FileStream(_path,System.IO.FileMode.Create);

			serializador.Serialize(writer,versionXML);

			writer.Close();
		}

		public void Escribir(Version versionXML, string destino)
		{
			XmlSerializer serializador = new XmlSerializer(typeof(Version));

			FileStream writer;
			
			writer = new FileStream(destino ,System.IO.FileMode.Create);

			serializador.Serialize(writer,versionXML);

			writer.Close();
		}

		public void CerrarVersion(string nroVersion)
		{
			string pathDeTrabajo = System.Configuration.ConfigurationSettings.AppSettings["pathDirectorioDeTrabajo"];
			
			string pathVAbierta = pathDeTrabajo + "V" + Constants.VERSION_ABIERTA_KEY;
			string pathVCerrada = pathDeTrabajo + "V" + nroVersion;
			
			string pathMetadatos = pathDeTrabajo + Constants.DIRECTORIO_METADATOS + Constants.VERSION_ABIERTA_KEY;
			string pathMetadatosCopy = pathDeTrabajo + Constants.DIRECTORIO_METADATOS + nroVersion;

			string archivoBVAbierta = pathVAbierta + @"\BV" + Constants.VERSION_ABIERTA_KEY + ".xml";
			string archivoBVCerrada = pathVCerrada + @"\BV" + nroVersion + ".xml";

			string archivoHVAbierta = pathVAbierta + @"\HV" + Constants.VERSION_ABIERTA_KEY + ".xml";
			string archivoHVCerrada = pathVCerrada + @"\HV" + nroVersion + ".xml";

			// Creo el nuevo directorio para la version que cerre
			Directory.CreateDirectory(pathVCerrada);
			Directory.CreateDirectory(pathMetadatosCopy);

			//muevo los arvhivos de la version que cerre al nuevo directorio
			if (File.Exists(archivoBVAbierta))
				this.MoveFile( archivoBVAbierta, archivoBVCerrada );
			if (File.Exists(archivoHVAbierta))
				this.MoveFile( archivoHVAbierta, archivoHVCerrada);
//			Directory.Move( archivoBVAbierta, archivoBVCerrada );
//			Directory.Move( archivoHVAbierta, archivoHVCerrada);

			foreach (string pathFile in Directory.GetFiles(pathMetadatos) )
			{
				File.Copy(	pathFile ,pathMetadatosCopy + GetNombreArchivo(pathFile) );
			}
		}

		public string GetNombreArchivo(string pathCompleto)
		{
			string barra = @"\";
			int pos = pathCompleto.LastIndexOfAny(barra.ToCharArray());
			string nombreFile = pathCompleto.Substring(pos, pathCompleto.Length - pos );
			return nombreFile;
		}

		private void MoveFile(string origen, string destino)
		{
			XmlDocument xmlDocRead = new XmlDocument();
			xmlDocRead.Load(origen);
			
			XmlWriter xmlWriter = new XmlTextWriter(destino, System.Text.Encoding.UTF8);
			xmlDocRead.WriteTo(xmlWriter);

			xmlWriter.Close();
			
			File.Delete(origen);
			
		}

		private void InicializarPathLectura(string nroVersion)
		{
			if (!nroVersion.Equals(string.Empty))
			{
				// Deserialization
				string dir=System.Configuration.ConfigurationSettings.AppSettings[Constants.APP_DIR_TRABAJO];
				//string dir = @"..\..\..\ArchivosXml";
				// Si no esta seteado el path levanto el por defecto.
				_path = dir +"V"+nroVersion+@"\BV"+nroVersion+".xml";
			}
		}

		private void InicializarPathEscritura()
		{
			if (_path == null)
			{
				string dir = System.Configuration.ConfigurationSettings.AppSettings[Constants.APP_DIR_TRABAJO];
				_path = dir + "V" + Constants.VERSION_ABIERTA_KEY+@"\BV"+Constants.VERSION_ABIERTA_KEY+".xml";
			}
		}
	}
}
